package Principales;
import java.util.Stack;



import Coleccionables.Coleccionable;

public abstract class Robot  extends Entidad{
	protected int Combustible;
    protected int Orientacion;
    protected int Pincel;
    protected int Puntos;
    protected Stack<Coleccionable> baul;
    protected final int maxBaul=5;    
    /**
     * 
     */
    public Robot(int mirarHacia) {        
    	Pincel=0;
        Puntos=0;
        Orientacion=mirarHacia;
        baul=new Stack<Coleccionable>();
        
    }

    /**
     * Activa el pincel del robot
     * @param color=1 blanco, color=2 negro, color=0 apagado
     */
    public void activarPincel(int color) {
       if(color==1)
    	   Pincel=1;//Blanco "Avisarle a la GUI"
       else
    	   if(color==2)	
    		  Pincel=2; //Negro "Avisarle a la GUI"
    	   else{
    		   try {
				throw new RobotException("Color incorrecto");
			} catch (RobotException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	   }
    }

    /**
     * Consume el combustible del robot al realizar la accion
     * @param cantidad de combustible
     * @return verdadero si pudo avanzar falso caso contrario
     */
    public boolean avanzarRobot(int i) {
        if(Combustible-i>=0)//tiene Combustible suficiente para avanzar
        {
        	Combustible=Combustible-i; 
        	return true;
        }        	
        else{
        	return false; // no puedo avanzar
        } 
    }		

    /**
     * Apaga el pincel del robot
     */
    public void desactivarPincel() {
        Pincel=0;
    }

    /**
     * Cambia la orientacion del robot
     * @param lado=1 gira a la izquierda, lado=-1 gira a la derecha
     * @return verdadero si pudo girar falso en caso contrario
     */
    public boolean girarRobot(int lado) { //Avisarle a la GUI
       
    	if(Combustible>=1){//tiene Combustible suficiente para girar
    		
    		Orientacion = (Orientacion+lado);
    		if (Orientacion==0)
    			Orientacion = 4;
    		else
    			if (Orientacion==5)
    				Orientacion = 1;	
    	Combustible--;
    	return true;
    	}    	
    	else
    		return false;
    }

    /**
     * Intenta agregar un coleccionable al baul
     * @param coleccionable
     * @return verdadero si pudo agregarse falso caso contrario
     */
    public boolean recogerColeccionable(Coleccionable c) {
    	if(baul.size() < maxBaul){
    		baul.push(c);
    		return true;
    	}
    	else{     		
    		return false;
    	}
    }   

    /**
     * Suelta un coleccionable del baul
     * @return coleccionable
     */
   public Coleccionable soltarColeccionable() {
        if(! baul.isEmpty())
        	return baul.pop();
        else return null;
    }
   
   /**
    * Se produce la suma de la accion especial
    * @param i
    */
	public abstract void sumarEspecial(int i); 

	/**
	    * Se produce la suma del puntaje
	    * @param i
	    */
	public void sumarPuntaje(int i) {
		Puntos=Puntos+i;		
	}

	/**
	    * Se produce la suma del combustible
	    * @param i
	    */
	public void sumarCombustible(int i) {
		Combustible=Combustible+i;		
	}
	
	/**
	 * Devuelve la orientacion del robot
	 * @return Orientacion=1 N, Orientacion=2 O, Orientacion=3 S, Orientacion=4 E 
	 */
	public int obtenerOrientacion(){
		return Orientacion;
	}
	/**
	 * Devuelve el estado del pincel
	 * @return pincel=1 blanco, pincel=2 negro, pincel=0 apagado
	 */
	public int obtenerPincel(){
		return Pincel;
	}
	/**
	 * Devuelve los puntos del robot
	 * @return puntos
	 */
	public int obtenerPuntaje(){
		return Puntos;
	}
	/**
	 * Devuelve el combustible del robot
	 * @return combustible
	 */
	public int obtenerCombustible()
	{
		return Combustible;
	}
	/**
	 * Ejecuta la accion especial
	 * @return verdadero si pudo realizarce falso caso contrario
	 */
	public abstract boolean especial();

	public abstract int obtenerEspecial() ;
}
